﻿#define  _CRT_SECURE_NO_WARNINGS 1
// int - 整数类型  float - 小数 char - 浮点型
// 数据类型分为内置类型，自定义类型
// 内置类型分为字符型，整型，浮点型，布尔类型
// short[int] - 短整型  int - 整型  long [int] - 长整型  long long [int] - 更长的整型
// [int]可以省略不写
// float - 单精度浮点型  double - 双精度浮点型   long double - 更高精度
// 早期c语言 使用整数0表示假 非零值表示真  在c99中引入布尔类型 取值：true和false
// 使用布尔值需要包含头文件<stdbool.h>

#include <stdbool.h>
#include <stdio.h>
//int main()
//{
//	_Bool flag = false;
//	bool flag2 = false;  //使用bool也可以 一样的
//	if (flag)
//		printf("ehhe\n");
//		return 0;
//}

// sizeof 用来计算操作符类型长度的（不是字符串） ，单位是字节
//sizeof(类型)
//sizeof(表达式)
//int main()
//{
//	// 使用zd打印才不会警告  sizeof 返回值是size_t  c语言规定此返回值是无符号整数，没有
// 规定具体的类型  所以就用size_t来表示这个返回值类型
//	// 字节: 计算中的单位    bit - 比特位   Byte - 字节   KB MB GB TB PB  
//	// 2进制 有1 0 一个2进制位的存储需要一个比特位的空间  1Byte = 8bit  1KB = 1024Byte 1MB = 1024KB
//	// 1024 = 2的10次方
//	// c语言标准规定sizeof(long) >= sizeof(int)  sizeof(double)>=sizeof(long double)
//	printf("%zd\n", sizeof(char)); // 1 字节
//	printf("%zd\n", sizeof(short));// 2
//	printf("%zd\n", sizeof(int)); // 4
//	printf("%zd\n", sizeof(long)); // 4
//	printf("%zd\n", sizeof(long long));// 8
//	printf("%zd\n", sizeof(float)); // 4
//	printf("%zd\n", sizeof(double)); // 8
//	printf("%d\n", sizeof(long double)); // 8
//
//
//
//	return 0;
//}

//int main()
//{
//	int a = 10;
//	printf("%zd\n", sizeof(int)); // 放类型不能省略括号 放表达式和变量可以省略
//	printf("%zd\n", sizeof(a));
//	printf("%zd\n", sizeof(a));
//
//}

//int main()
//{
//	printf("%zd\n", sizeof(bool)); // 布尔类型长度是1
//	return 0;
//}

// sizeof中表达式是不计算的
//int main()
//{
//	short s = 2;
//	int b = 10;
//	printf("%zd\n", sizeof(s = b + 1)); //结果是2 1是int类型  b也是int类型 s是short类型
//	// int放到short里面去还是s说的算  所以short类型长度是2  由表达式类型推断的
//	printf("s = %d\n", s); // s还是2 不是11
//	return 0;
//}

//C 语⾔使⽤ signed 和 unsigned 关键字修饰字符型和整型类型的。
//signed 关键字，表⽰⼀个类型带有正负号，包含负值；
//unsigned 关键字，表⽰该类型不带有正负号，只能表⽰零和正整数。
//对于 int 类型，默认是带有正负号的，也就是说 int 等同于 signed int 。
//由于这是默认情况，关键字 signed ⼀般都省略不写，但是写了也不算错。
// unsigned int 这样就可以表示0和正整数的int
// signed int -- 有符号的int
// char -- char到底有没有符号呢？ 这个不确定，取决于编译器的实现  
// 大部分编译器char 等价于 signed char
// signed char
// unsigned char
//
//整数变量声明为 unsigned 的好处是，同样⻓度的内存能够表⽰的最⼤整数值，增⼤了⼀倍。
//⽐如，16位的 signed short int 的取值范围是： - 32768~32767，最⼤是32767；⽽
//unsigned short int 的取值范围是：0~65535，最⼤值增⼤到了65, 535。32位的 signed
//int 的取值范围可以参看 limits.h 中给出的定义。

// 对于有符号的整数打印应该使用%d
// 无符号的打印应该使用%u

//int main()
//{
//	int num = -100;
//	printf("%d\n", num);
//	return 0;
//}

//int num = 1; // 全局变量
//// 变量的创建时给他一个值就是变量的初始化 如果不初始化 这个变量就是随机值
//// data_type name;  前面是数据类型  后面是名字
//int main()
//{
//	// 这些都是局部变量
//	int age;
//	char ch;
//	float score = 3.14f;  //3.14默认是double类型，想变成float在后＋f
//	double weght;
//	int s = 0; // 初始化
//
//	return 0;
//}

// 局部变量只能在局部使用  全局变量可以在全局使用
//int m = 1000;
//int main()
//{
//	int m = 100;
//	printf("%d\n", m);  // 最后结果是100 当局部变量和全局变量名字一样 并且在这都能使用时
//	// 局部变量优先 
//	return 0;
//}

// 算术操作符 + - * / %  加 减 乘 除 取余（模） 操作符也叫运算符
// 双面操作符 操作符旁边有两个操作数

//int main()
//{
//	printf("%d\n", 33 + 42);
//	return 0;
//}

// 如果/号两端是整数，最后是执行整数除法得到的是整数
// 打印float用%f  打印double %lf 打印
//%.1f 保留一位小数
//int main()
//{
//	printf("%d\n", 9 / 3); // 3
//	printf("%d\n", 10 / 3); // 3
//	printf("%d\n", 10 / 4); // 2
//	printf("%.1f\n", 10.0 / 4); // 2.5
//	printf("%.1f\n", 10.0 / 3); // 3.3
//
//
//	return 0;
//}

//int main()
//{
//	int score = 5;
//	score = (score / 20) * 100; //在我们看来结果是25，实际是0 因为score / 20 = 0
//	printf("%d", score);
//	return 0;
//}

// %只能用于整数，不可以用于浮点数
// 所以我们可以用来判断某些数是否可以整除
//int main()
//{
//	int a = 10 % 3;
//	printf("%d\n", a);  // 1
//	return 0;
//}

// 负数求模的规则，它的符号取决于第一个运算符的符号决定
//int main()
//{
//	printf("%d\n", 11 % -5); // 1
//	printf("%d\n", -11 % -5);// -1
//	printf("%d\n", -11 % 5);// -1
//
//	return 0;
//}

// 赋值操作符
//int main()
//{
//	int a = 0; // 初始化
//	a = 4; // 赋值  = 就是赋值操作符
//	return 0;
//}

// int a = 3    int b = 5   int c = 0
// c = b =a +3 c语言虽然支持连续赋值，但是写出的代码不容易理解所以我们还是拆开来写
// a + 3 赋给b 所以b=6 然后把b的值赋给c 所以c=6 从右往左赋值

// 复合赋值符  +=  -=  *=  /=  %=等等
//int main()
//{
//	int a = 0;
//	a = a + 10;
//	a += 10; // 复合赋值
//	a = a - 3;
//	a -= 3;
//}

//单目操作符  ++ --  + -
//++是⼀种⾃增的操作符，⼜分为前置++和后置++，--是⼀种⾃减的操作符，也分为前置--和后置--.
//int main()
//{
//	int a = 5;
//	a = a + 1; // a自增1
//	a++; // 也是a自增1
//	++a; // 也是a自增1
//	printf("%d\n", a);
//
//	return 0;
//}

//int main()
//{
//	int a = 5;
//	//int b = ++a; //前置++  口诀: 先++，后使用
//	int b = a++; //后置++  口诀: 先使用，后++
//	printf("a = %d\n", a); // 前置++：a = 6  b = 6   区别在b赋值
//	printf("b = %d\n", b); //  后置++： a=6  b = 5
//	return 0;
//}

//int main()
//{
//	int a = 5;
//	//int b = --a; //前置--  口诀: 先--，后使用
//	int b = a--; //后置--  口诀: 先使用，后--
//	printf("a = %d\n", a); // 前置--：a = 4  b = 4   区别在b赋值
//	printf("b = %d\n", b); // 后置--: a = 4  b = 5
//	return 0;
//}

//int main()
//{
//	int a = 5;
//	//printf("%d\n", --a); // 4
//	printf("%d\n", a--); // 5
//
//	return 0;
//}

//int main()
//{
//	int a = -10;
//	printf("%d\n", -a); //10
//	return 0;
//}

// 强制性转换; (类型)
//int main()
//{
//	//int a = 3.14; // 3.14是double类型
//	int a = (int)3.14; //这样就可以强制转换为整型
//	printf("%d", a);
//	return 0;
//}

